О создании резервной копии сайта

Удобно, когда необходимые к исполнению задачи автоматизированы, а хранилище данных надёжно, доступно и просто в пользовании.

Ознакомился с «Object Storage» на сервисе Яндекс.Облако и клиентом «s3cmd». Написал очень простенький сценарий (скрипт) для резервного копирования сайта.

Настройка на сервисе Яндекс.Облако

Создаем «бакет» в «Object Storage» на сервисе Яндекс.Облако: Консоль управления => Object Storage => Создать бакет

В настройках «бакета» лучше ограничить максимальный размер, доступ к объектам и класс хранилища установить как «холодное».

Создаем «сервисный аккаунт» в Яндекс.Облаке: Облако => Сервисные аккаунты => Создать сервисный аккаунт (с ролью «editor»).

Создаем ключи для «сервисного аккаунта»: Имя сервисного аккаунта => Создать новый ключ => Создать статический ключ доступа

Сохраняем КЛЮЧ ДОСТУПА и СЕКРЕТНЫЙ КЛЮЧ.

Настройка на сервере

Создаем директории для резервных копий:

mkdir ~/BACKUP
mkdir ~/BACKUP/backup_db
mkdir ~/BACKUP/backup_site
mkdir ~/BACKUP/zip

Создаем файл «s3cmd_script.sh» — сценарий (скрипт) резервного копирования:

touch ~/BACKUP/s3cmd_script.sh

Записываем в файл «s3cmd_script.sh» следующие строки:

#!/bin/sh
# Дата и время
DATETIME=`date +%Y-%m-%d_%H-%M`;
# Создание локальной копии файлов сайта
cp -r /var/www/html/* ~/BACKUP/backup_site
# Создание локальной копии базы данных сайта
mysqldump -u ПОЛЬЗОВАТЕЛЬ_СУБД -pПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_СУБД ИМЯ_КОПИРУЕМОЙ_БД > ~/BACKUP/backup_db/dump_$DATETIME.sql
# Создание ZIP-архива базы данных сайта
zip -r ~/BACKUP/zip/dump_$DATETIME.zip ~/BACKUP/backup_db/dump_$DATETIME.sql
#Создание ZIP-архива файлов сайта
zip -r ~/BACKUP/zip/site_$DATETIME.zip ~/BACKUP/backup_site/
# Синхронизация содержимого "~/BACKUP/zip" с Яндекс.Облаком
s3cmd sync \
 --bucket-location=EU \
 --exclude 'sqldump/*' \
 ~/BACKUP/zip \
 s3://ИМЯ_БАКЕТА
# Удаление локальных копий ZIP
rm -rf ~/BACKUP/zip/*.zip

Помечаем файл «s3cmd_script.sh» как исполняемый:

sudo chmod +x ~/BACKUP/s3cmd_script.sh

Устанавливаем «s3cmd» — консольный клиент для сервисов, поддерживающих HTTP API Amazon S3:

sudo apt install s3cmd

Настраиваем «s3cmd» на работу с Яндекс.Облаком:

s3cmd --configure

Команда «s3cmd --configure» сохранит настройки в файле «~/.s3cfg».

При необходимости можно создать этот файл самостоятельно или отредактировать его параметры.

Основные параметры для синхронизации с Яндекс.Облаком:

access_key = КЛЮЧ_ДОСТУПА
secret_key = СЕКРЕТНЫЙ_КЛЮЧ
host_bucket = storage.yandexcloud.net/ИМЯ_БАКЕТА
bucket_location = ru-central1

Содержание файла «~/.s3cfg» следующее:

[default]
access_key = КЛЮЧ_ДОСТУПА
access_token = 
add_encoding_exts = 
add_headers = 
bucket_location = ru-central1
ca_certs_file = 
cache_file = 
check_ssl_certificate = True
check_ssl_hostname = True
cloudfront_host = cloudfront.amazonaws.com
content_disposition = 
content_type = 
default_mime_type = binary/octet-stream
delay_updates = False
delete_after = False
delete_after_fetch = False
delete_removed = False
dry_run = False
enable_multipart = True
encoding = UTF-8
encrypt = False
expiry_date = 
expiry_days = 
expiry_prefix = 
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase = 
guess_mime_type = True
host_base = storage.yandexcloud.net
host_bucket = storage.yandexcloud.net/ИМЯ_БАКЕТА
human_readable_sizes = False
invalidate_default_index_on_cf = False
invalidate_default_index_root_on_cf = True
invalidate_on_cf = False
kms_key = 
limit = -1
limitrate = 0
list_md5 = False
log_target_prefix = 
long_listing = False
max_delete = -1
mime_type = 
multipart_chunk_size_mb = 15
multipart_max_chunks = 10000
preserve_attrs = True
progress_meter = True
proxy_host = 
proxy_port = 0
put_continue = False
recursive = False
recv_chunk = 65536
reduced_redundancy = False
requester_pays = False
restore_days = 1
restore_priority = Standard
secret_key = СЕКРЕТНЫЙ_КЛЮЧ
send_chunk = 65536
server_side_encryption = False
signature_v2 = False
signurl_use_https = False
simpledb_host = sdb.amazonaws.com
skip_existing = False
socket_timeout = 300
stats = False
stop_on_error = False
storage_class = 
throttle_max = 100
upload_id = 
urlencoding_mode = normal
use_http_expect = False
use_https = True
use_mime_magic = True
verbosity = WARNING
website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
website_error = 
website_index = index.html

Запускаем сценарий резервного копирования:

~/BACKUP/s3cmd_script.sh

Резервная копия сайта создана и загружена в «бакет» на сервисе Яндекс.Облако.

Добавляем сценарий (скрипт) «~/BACKUP/s3cmd_script.sh» в планировщик заданий:

crontab -e

В открывшийся файл добавляем строку. Например:

12 3 1 * * /home/ИМЯ_ПОЛЬЗОВАТЕЛЯ/BACKUP/s3cmd_script.sh

Согласно данной записи, резервное копирование сайта будет осуществляться 1-ого числа каждого месяца в 3 часа 12 минут ночи.

Если желаете осуществлять шифрование резервных копий до их загрузки в «бакет», отредактируйте в файле «~/.s3cfg» строку:

gpg_passphrase = ЗАДАЙТЕ_ПАРОЛЬ_ДЛЯ_ШИФРОВАНИЯ

Файл «s3cmd_script.sh» — сценарий (скрипт) резервного копирования с шифрованием файлов:

#!/bin/sh
# Дата и время
DATETIME=`date +%Y-%m-%d_%H-%M`;
# Создание локальной копии базы данных сайта
mysqldump -u ПОЛЬЗОВАТЕЛЬ_СУБД -pПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_СУБД ИМЯ_КОПИРУЕМОЙ_БД > ~/BACKUP/backup_db/dump_$DATETIME.sql
# Создание ZIP-архива базы данных сайта и файлов сайта
zip -r ~/BACKUP/zip/dump_$DATETIME.zip ~/BACKUP/backup_db/dump_$DATETIME.sql
zip -r ~/BACKUP/zip/site_$DATETIME.zip /var/www/html/*
# Шифрование и загрузка файлов в Яндекс.Облако
s3cmd -e put ~/BACKUP/zip/site_$DATETIME.zip s3://ИМЯ_БАКЕТА
s3cmd -e put ~/BACKUP/zip/dump_$DATETIME.zip s3://ИМЯ_БАКЕТА
# Удаление локальных копий
rm -rf ~/BACKUP/zip/*.zip
rm -rf ~/BACKUP/backup_db/*
rm -rf ~/BACKUP/backup_site/*

Получение файла из «бакета» и расшифровка файла:

s3cmd get s3://ИМЯ_БАКЕТА/ИМЯ_ФАЙЛА

Всего Вам хорошего.


Публикации на тему:

https://cloud.yandex.ru/docs/storage/concepts/bucket

https://cloud.yandex.ru/docs/storage/tools/s3cmd

https://ru.wikipedia.org/wiki/Cron

https://help.ubuntu.com/community/CronHowto

https://habr.com/ru/post/90244/

https://habr.com/ru/post/515872/

https://www.opennet.ru/docs/RUS/bash_scripting_guide/

https://help.dreamhost.com/hc/en-us/articles/360022340471-Encrypting-data-with-S3cmd

ВВЕРХ